package services

import (
	"blog-backend/internal/app/models"
	"blog-backend/internal/app/repositories"
	"errors"
	"strings"
)

type CategoryService struct {
	categoryRepo *repositories.CategoryRepository
}

func NewCategoryService() *CategoryService {
	return &CategoryService{
		categoryRepo: repositories.NewCategoryRepository(),
	}
}

// GetCategories 获取所有分类
func (s *CategoryService) GetCategories() ([]models.Category, error) {
	return s.categoryRepo.GetAll()
}

func (s *CategoryService) GetPopularCategories(limit int) ([]models.Category, error) {
	return s.categoryRepo.GetPopularCategories(limit)
}

// CreateCategory 创建分类
func (s *CategoryService) CreateCategory(name string) (*models.Category, error) {
	// 检查分类名称是否已存在
	if s.categoryRepo.NameExists(name) {
		return nil, errors.New("分类名称已存在")
	}
	
	category := &models.Category{
		Name: name,
		Slug: generateSlug(name),
	}
	
	if err := s.categoryRepo.Create(category); err != nil {
		return nil, errors.New("创建分类失败")
	}
	
	return category, nil
}

// UpdateCategory 更新分类
func (s *CategoryService) UpdateCategory(id uint, name string) (*models.Category, error) {
	category, err := s.categoryRepo.GetByID(id)
	if err != nil {
		return nil, errors.New("分类不存在")
	}
	
	// 检查新名称是否已存在
	if name != category.Name && s.categoryRepo.NameExists(name) {
		return nil, errors.New("分类名称已存在")
	}
	
	category.Name = name
	category.Slug = generateSlug(name)
	
	if err := s.categoryRepo.Update(category); err != nil {
		return nil, errors.New("更新分类失败")
	}
	
	return category, nil
}

// DeleteCategory 删除分类
func (s *CategoryService) DeleteCategory(id uint) error {
	// 检查分类下是否有文章
	if s.categoryRepo.HasPosts(id) {
		return errors.New("分类下有文章，无法删除")
	}
	
	if err := s.categoryRepo.Delete(id); err != nil {
		return errors.New("删除分类失败")
	}
	
	return nil
}

// generateSlug 生成URL友好的slug
func generateSlug(name string) string {
	// 这里可以添加更复杂的slug生成逻辑
	// 例如：转换为小写、替换空格为连字符、移除特殊字符等
	return strings.ToLower(strings.ReplaceAll(name, " ", "-"))
}